{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 采用5折交叉验证，用正确率，对Logistic回归模型的正则超参数调优。（50分）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.670968</td>\n",
       "      <td>0.489796</td>\n",
       "      <td>0.304348</td>\n",
       "      <td>0.133413</td>\n",
       "      <td>0.314928</td>\n",
       "      <td>0.234415</td>\n",
       "      <td>0.483333</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.264516</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.239130</td>\n",
       "      <td>0.133413</td>\n",
       "      <td>0.171779</td>\n",
       "      <td>0.116567</td>\n",
       "      <td>0.166667</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.896774</td>\n",
       "      <td>0.408163</td>\n",
       "      <td>0.239130</td>\n",
       "      <td>0.133413</td>\n",
       "      <td>0.104294</td>\n",
       "      <td>0.253629</td>\n",
       "      <td>0.183333</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.058824</td>\n",
       "      <td>0.290323</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0.173913</td>\n",
       "      <td>0.096154</td>\n",
       "      <td>0.202454</td>\n",
       "      <td>0.038002</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.163265</td>\n",
       "      <td>0.304348</td>\n",
       "      <td>0.185096</td>\n",
       "      <td>0.509202</td>\n",
       "      <td>0.943638</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.352941                      0.670968        0.489796   \n",
       "1   0.058824                      0.264516        0.428571   \n",
       "2   0.470588                      0.896774        0.408163   \n",
       "3   0.058824                      0.290323        0.428571   \n",
       "4   0.000000                      0.600000        0.163265   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.304348       0.133413  0.314928   \n",
       "1                     0.239130       0.133413  0.171779   \n",
       "2                     0.239130       0.133413  0.104294   \n",
       "3                     0.173913       0.096154  0.202454   \n",
       "4                     0.304348       0.185096  0.509202   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  target  \n",
       "0                    0.234415  0.483333       1  \n",
       "1                    0.116567  0.166667       0  \n",
       "2                    0.253629  0.183333       1  \n",
       "3                    0.038002  0.000000       0  \n",
       "4                    0.943638  0.200000       1  "
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "train = pd.read_csv(\"diabertes_FE_train_org.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = train['target']   \n",
    "X_train = train.drop([\"target\"], axis=1)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns \n",
    "\n",
    "#sklearn的学习器大多之一稀疏数据输入，模型训练会快很多\n",
    "#查看一个学习器是否支持稀疏数据，可以看fit函数是否支持: X: {array-like, sparse matrix}.\n",
    "#可自行用timeit比较稠密数据和稀疏数据的训练时间\n",
    "from scipy.sparse import csr_matrix\n",
    "X_train = csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 超参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='warn',\n",
       "          n_jobs=None, penalty='l2', random_state=None, solver='liblinear',\n",
       "          tol=0.0001, verbose=0, warm_start=False),\n",
       "       fit_params=None, iid='warn', n_jobs=-1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [ 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=5, scoring='neg_log_loss',n_jobs = -1,)\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47556641387492316\n",
      "{'C': 10, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分别使用L1,L2正则，参数取0.1,1，10,100,1000。共10种进行调优，最后结果L2正则、参数为10时取得最好分数。图中也可以看出，log（c）=1时已经达到较好的结果了，后面继续变化并没有对结果产生较明显的影响"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
